const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const corsMiddleware = require('./middleware/cors');
const { errorHandler, notFoundHandler, loggerMiddleware } = require('./middleware/errorHandler');
const router = require('./routes');
const { connectDB, disconnectDB } = require('./config/db');
const WebSocketServer = require('./websocket/connectionHandler');
require('dotenv').config();

const app = new Koa();
const PORT = process.env.PORT || 3000;

// 全局错误处理
app.on('error', (err) => {
  console.error('未捕获的错误:', err);
});

// 使用中间件
app.use(loggerMiddleware);
app.use(corsMiddleware);
app.use(bodyParser({ jsonLimit: '10mb' }));
app.use(errorHandler);
app.use(notFoundHandler);

// 连接数据库并加载模型
async function initializeApp() {
  try {
    // 连接数据库
    await connectDB();
    console.log('MongoDB 连接成功');
    
    // 加载并注册所有模型（确保在路由之前加载）
    const models = require('./models');
    models.ensureModelsRegistered();
    console.log('所有模型已加载');
    
    // 使用路由（此时模型已注册）
    app.use(router.routes());
    app.use(router.allowedMethods());
    
    // 初始化WebSocket
    const wss = new WebSocketServer(server);
    
    // 启动服务器
    server.listen(PORT, () => {
      console.log(`服务器运行在 http://localhost:${PORT}`);
      console.log(`WebSocket服务已启动`);
    });
  } catch (err) {
    console.error('应用初始化失败:', err);
    process.exit(1);
  }
}

// 创建HTTP服务器
const server = require('http').createServer(app.callback());

// 初始化应用
initializeApp();

// 处理服务器错误
server.on('error', (error) => {
  console.error('服务器错误:', error);
});

// 优雅关闭
const gracefulShutdown = async () => {
  console.log('正在关闭服务器...');
  
  // 关闭HTTP服务器
  server.close(() => {
    console.log('HTTP服务器已关闭');
    
    // 断开数据库连接
    disconnectDB().then(() => {
      console.log('数据库连接已关闭');
      process.exit(0);
    }).catch(err => {
      console.error('关闭数据库连接失败:', err);
      process.exit(1);
    });
  });
};

// 监听终止信号
process.on('SIGINT', gracefulShutdown);
process.on('SIGTERM', gracefulShutdown);

module.exports = app;
